package com.wu.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSONObject;
import com.wu.dao.ExcelDao;
import com.wu.pojo.bean.ExcelBean;
import com.wu.pojo.bean.ReadExcel;
import com.wu.pojo.po.paperPo.Paper;
import com.wu.pojo.po.paperPo.Question;
import com.wu.pojo.res.Result;
import com.wu.service.ExcelService;
import com.wu.service.PaperService;
import com.wu.service.QuestionService;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.NumberFormat;
import java.util.*;

import static com.wu.constants.Constants.*;

@Service
public class ExcelServiceImpl implements ExcelService{
    /**
     * 批量导入（批量添加）
     */
    @Autowired
    private ExcelDao excelDao;
    @Autowired
    private PaperService paperService;
    @Autowired
    private QuestionService questionService;

    /**
     * 上传问卷-解析问卷-批量录入答案
     * Date 20210506
     */
    @Transactional
    @Override
    public Result readExcelFile(byte[] pic, String name) {

        // 1、解析excel，获取上传的参数
        ReadExcel readExcel = new ReadExcel();
        Map map = readExcel.getExcelInfo(pic, name);
        List<ExcelBean> list = (List<ExcelBean>)map.get("cellList");// 拿到cellList
        for (ExcelBean excelBean : list) {
            excelBean.setPaperId((String)map.get("sheetName"));// 将sheetName放入标志位
        }

        // 2、数据校验

        // 3、数据入库
        JSONObject json = new JSONObject();
        try {
            excelDao.addBatchMembers(list);//批量添加 (执行sql语句批量增加)

            list.forEach(System.out::println);
            json.put("excel", list);
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 3、格式校验
        // 1.校验问卷id、行数、列数  sheet： title+paperId

        // 2.校验答案
        // 单选 单选题=>无符号
        //      多选题=>逗号分割后判断有无符号
        // 3.答案数据录入(answerList、userId、paperId、questionId)
        // 4.回滚

        return Result.succ("导入数据成功", json);
    }

    /**
     * 创建问卷模板，excel cell遍历列表
     * @param paperId
     * Date 20210507
     */
    @Transactional
    @Override
    public String createExcelFile(String paperId, String title) {

        // 拿到questionList
        List<Question> list = questionService.queryQuestionByPaperId(paperId);

        // 1、创建workbook对象（.xlsx）
        XSSFWorkbook wb = new XSSFWorkbook();
        // 建立新的sheet对象（excel的表单）
        //sheet： title + paperId(前五位)确定问卷唯一性，用于之后上传问卷校验
        XSSFSheet sheet = wb.createSheet(title+"#"+paperId.substring(0,5));
        // 在sheet里创建第一行，参数为行索引(excel的行)，可以是0～65535之间的任何一个
        XSSFRow row0 = sheet.createRow(0);
        // 添加表头
        row0.createCell(0).setCellValue("序号");
        row0.createCell(1).setCellValue("题型");
        row0.createCell(2).setCellValue("题型名称");
        row0.createCell(3).setCellValue("问题标题");
        row0.createCell(4).setCellValue("选项");
        row0.createCell(5).setCellValue("答案选择(多选题请用逗号隔开)");

        //格式化数字
        NumberFormat nf = NumberFormat.getInstance();
        // 创建单元格（excel的单元格，参数为列索引，可以是0～255之间的任何一个

        // 在sheet里创建往下的行
        for(int i= 0;i<list.size();i++){
            XSSFRow row = sheet.createRow(i+1);
            row.createCell(0).setCellValue(list.get(i).getQuestionNo()); //序号
            row.createCell(1).setCellValue(list.get(i).getQuestionType()); //题型
            //1：单选题2：多选题3：简答题
            String questionType = list.get(i).getQuestionType();
            row.createCell(2)
                    .setCellValue(questionType.equals("1") ? "单选题": questionType .equals("2")? "多选题" : "简答题"); //题型名称
            row.createCell(3).setCellValue(list.get(i).getQuestionTitle());  //问题
            row.createCell(4).setCellValue(list.get(i).getQuestionOption()); //选项
        }

        //判断是否存在目录. 不存在则创建
//        isChartPathExist(filepath);
        //路径

        String filePath = PREFIX_EXCEL.concat(list.get(0).getId()).concat(SUFFIX_EXCEL);
        //输出Excel文件1  
        FileOutputStream output= null;
        try {
            output = new FileOutputStream(ROOT_PATH.concat(filePath));
            wb.write(output);//写入磁盘  
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        paperService.updatePaper(new Paper().setPaperId(paperId).setFilePath(filePath));
        return filePath;
    }

    /**
     * 获取备份列表
     */

    @Override
    public List<ExcelBean> queryBakAnswerListByPK(String pk) {
        return excelDao.queryBakAnswerListByPK(pk);
    }
}